package com.example.myhl7project;

import ca.uhn.hl7v2.AcknowledgmentCode;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.Structure;
import ca.uhn.hl7v2.parser.Parser;
import ca.uhn.hl7v2.util.Terser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class MyHL7BusinessLogicService {

    public Message handleMessage(Message message) throws Exception {
        Terser terser = new Terser(message);

        // 1. 获取消息类型 (MSH-9)
        String messageType = terser.get("/MSH-9");
        // 期望的消息类型是 ORU^R01^ORU_R01
        if (!"ORU^R01^ORU_R01".equals(messageType)) {
            // 如果不是我们期望的消息，可以记录日志，但依然返回ACK
            System.out.println("Unsupported message type: " + messageType);
            return message; // 返回原始消息用于生成ACK
        }

        // 2. 获取字符集 (MSH-18)
        String charset = terser.get("/MSH-18");
        if (charset == null || charset.isEmpty()) {
            charset = "ISO8859_1"; // 默认字符集
        }

        // 3. 提取PID段信息
        String patientId = terser.get("/PID-3"); // 患者标识符表
        String patientName = terser.get("/PID-5"); // 患者姓名
        String birthDate = terser.get("/PID-7"); // 出生日期
        String gender = terser.get("/PID-8"); // 性别

        // 4. 提取PV1段信息
        String patientClass = terser.get("/PV1-2"); // 患者类别
        String patientLocation = terser.get("/PV1-3"); // 指定患者位置
        String attendingDoctor = terser.get("/PV1-7"); // 接诊医生

        // 5. 提取OBR段信息
        String setIdOBR = terser.get("/OBR-4"); // 设置ID-OBR，应为"Monitor"
        String observationDateTime = terser.get("/OBR-7"); // 观察日期/时间

        // 6. 处理OBX段：可能有多个OBX段
        // 使用HAPI的Structure遍历
        Structure[] obxStructures = message.getAll("OBX");
        for (Structure obxStructure : obxStructures) {
            Terser obxTerser = new Terser((Message) obxStructure);
            // 获取OBX-2（值类型）、OBX-3（观察标识符）、OBX-4（观察子ID）、OBX-5（观察结果）、OBX-11（观察结果状态）等
            String valueType = obxTerser.get("/OBX-2");
            String observationId = obxTerser.get("/OBX-3");
            String subId = obxTerser.get("/OBX-4");
            String observationValue = obxTerser.get("/OBX-5");
            String observationStatus = obxTerser.get("/OBX-11");
            // 根据不同的观察标识符和值类型，处理不同类型的参数
            // 例如，上线模块参数标志：valueType为CE，observationId为5^^BHC
            // 周期参数值：valueType为NM，observationId为具体的参数ID（如201^HR^BHC）
            // 非周期参数值：valueType为NM，并且有额外的字段（如OBX-13和OBX-14）
            String userDefinedAccess = obxTerser.get("/OBX-13"); // 用户定义的访问查询，非周期参数为"APERIODIC"
            String observationTime = obxTerser.get("/OBX-14"); // 观察时间

            // 这里可以根据这些字段进行业务处理，比如存储到数据库等
            System.out.println("OBX: observationId=" + observationId + ", value=" + observationValue);
        }

        // 返回原始消息，以便路由层生成ACK
        return message;
    }
}